// 1.原始模式
var stu = new Object();
//上面和下面这两个语句是等效的
// var stu = {}
stu.name = "杨浩";
stu.age = 20;
stu.say = function() { console.log("啊里呀色哟！") };

// 2. 工厂模式，定义一个创建对象的函数，传入对象的参数，可以根据参数批量去创建对象

// function createStu(x, y, z) {
//     //定义一个空的对象
//     var obj = {};
//     obj.name = x;
//     obj.age = y;
//     obj.say = z
//     return obj
// }

// function talk() {
//     console.log('hello');
//     return '123'
// }
// 传参路径 talk --> z --> obj.say

function createStu(name, age) {
    //定义一个空的对象
    var obj = {};
    obj.name = name;
    obj.age = age;
    obj.say = function() {
        console.log(`hello i am ${this.name}`)
    }
    return obj
}
var stu1 = createStu("lucy", 20);
var stu2 = createStu("lily", 20);

// 3.构造函数
//创建构造函数，构造函数的名称首字母大写， 这是一种规范，小写不会报错，但是不符合规范也不直观。
function Person(name, age) {
    //this代表即将创建的对象
    this.name = name;
    this.age = age;
    this.say = function() {
        console.log(`hello i am ${this.name}`)
    };

}


//用构造函数去创建对象，注意此方法构造函数前面必须加 new
var p1 = new Person("杨浩", 22);
var p2 = new Person("毛从平", 23);
Object.defineProperty(p1, 'name', {
        writable: false
    })
    //构造函数和属性设置配合使用
function Person1(name, age) {
    this.age = age;
    this.say = function() {
        console.log(`hello i am ${this.name}`)
    };
    //设置对象的name属性
    Object.defineProperty(this, 'name', {
        //name属性不可写
        writable: false,
        //name属性不可删除·
        configurable: false,
        //默认值由构造函数的形参name传入
        value: name
    })

}

var p11 = new Person1("毛从平", 20)